home *** CD-ROM | disk | FTP | other *** search
- public class DES extends DESPriv implements Cryptor {
- private boolean _blockMode;
- private byte[] lastBlock = new byte[8];
- public static final int DES_BLOCK_SIZE = 8;
- public static final int DES_KEY_SIZE = 8;
-
- public DES(byte[] var1, boolean var2) throws IllegalArgumentException {
- super(0);
- this.setState(var1, var2);
- }
-
- public DES() {
- super(0);
- }
-
- public void setState(byte[] var1, boolean var2) throws IllegalArgumentException {
- if (var1.length < 8) {
- throw new IllegalArgumentException("Bad DES key length");
- } else {
- this._blockMode = var2;
- byte[] var3 = new byte[8];
-
- for(byte var4 = 0; var4 < 8; ++var4) {
- this.lastBlock[var4] = 0;
- var3[var4] = var1[var4];
- }
-
- for(byte var7 = 0; var7 < 8; ++var7) {
- int var6 = 0;
-
- for(int var5 = 0; var5 < 7; ++var5) {
- if ((var3[var7] & 1 << var5) != 0) {
- ++var6;
- }
- }
-
- if ((var6 & 1) == 0) {
- var3[var7] |= -128;
- } else {
- var3[var7] = (byte)(var3[var7] & 127);
- }
- }
-
- super.setkey(var3);
- }
- }
-
- public int encryptBlock(byte[] var1, int var2, int var3, byte[] var4, int var5, boolean var6) throws IllegalArgumentException {
- byte[] var7 = new byte[8];
- if (var3 > 8) {
- throw new IllegalArgumentException("DES Block Size Exceeded");
- } else {
- if (var3 != 0) {
- StringUtils.bcopy(var1, var2, var7, 0, var3);
- }
-
- if (var3 < 8) {
- if (!var6) {
- throw new IllegalArgumentException("unaligned DES block");
- }
-
- var7[7] = (byte)var3;
- }
-
- if (!this._blockMode) {
- for(int var9 = 0; var9 < 8; ++var9) {
- var7[var9] ^= this.lastBlock[var9];
- }
- }
-
- super.endes(var7);
- if (!this._blockMode) {
- StringUtils.bcopy(var7, this.lastBlock, 8);
- }
-
- int var8 = 8;
- StringUtils.bcopy(var7, 0, var4, var5, 8);
- if (var6) {
- if (var3 == 8) {
- int var10 = this.encryptBlock((byte[])null, 0, 0, var4, var5 + 8, true);
- var8 += var10;
- }
-
- if (var3 != 0) {
- StringUtils.bzero(this.lastBlock, 0, 8);
- }
- }
-
- return var8;
- }
- }
-
- public int decryptBlock(byte[] var1, int var2, byte[] var3, int var4, boolean var5) throws IllegalArgumentException {
- byte[] var6 = new byte[8];
- byte[] var7 = new byte[8];
- if (var1.length - var2 < 8) {
- throw new IllegalArgumentException("Insufficient cipherText");
- } else {
- StringUtils.bcopy(var1, var2, var6, 0, 8);
- if (!this._blockMode && !var5) {
- StringUtils.bcopy(var1, var2, var7, 0, 8);
- }
-
- super.dedes(var6);
- if (!this._blockMode) {
- for(int var9 = 0; var9 < 8; ++var9) {
- var6[var9] ^= this.lastBlock[var9];
- }
-
- if (!var5) {
- StringUtils.bcopy(var7, this.lastBlock, 8);
- }
- }
-
- byte var8;
- if (var5) {
- byte var10 = var6[7];
- if (var10 > 7) {
- throw new IllegalArgumentException("Bad cipherText");
- }
-
- var8 = var10;
- StringUtils.bzero(this.lastBlock, 0, 8);
- } else {
- var8 = 8;
- }
-
- if (var8 != 0) {
- StringUtils.bcopy(var6, 0, var3, var4, var8);
- }
-
- return var8;
- }
- }
-
- public int plainBlockSize() {
- return 8;
- }
-
- public int cipherBlockSize() {
- return 8;
- }
-
- public int cipherTextSize(int var1) {
- int var2 = (var1 + 8 - 1) / 8;
- return var2 * 8;
- }
-
- public byte[] encrypt(byte[] var1) throws IllegalArgumentException, Exception {
- int var2 = 0;
- int var7 = 0;
- if (var1.length == 0) {
- throw new IllegalArgumentException("NULL Plaintext");
- } else {
- int var8 = var1.length + 8 & -8;
- byte[] var6 = new byte[var8];
- int var3 = var1.length;
-
- while(true) {
- int var4;
- boolean var9;
- if (var3 <= 8) {
- var9 = true;
- var4 = var3;
- } else {
- var9 = false;
- var4 = 8;
- }
-
- int var5 = this.encryptBlock(var1, var2, var4, var6, var7, var9);
- if (var5 == 0) {
- throw new Exception("NULL Ciphertext (Internal Error)");
- }
-
- if (var7 + var5 > var8) {
- throw new Exception("NULL Ciphertext (Internal Error)");
- }
-
- if (var9) {
- return var6;
- }
-
- var7 += var5;
- var2 += var4;
- var3 -= var4;
- }
- }
- }
-
- public byte[] decrypt(byte[] var1) throws IllegalArgumentException, Exception {
- int var2 = 0;
- int var6 = 0;
- int var3 = var1.length;
- if (var3 % 8 != 0) {
- throw new IllegalArgumentException("Unaligned Ciphertext");
- } else if (var3 == 0) {
- throw new IllegalArgumentException("NULL Ciphertext");
- } else {
- byte[] var4;
- for(var4 = new byte[var3]; var3 != 0; var3 -= 8) {
- boolean var7;
- if (var3 == 8) {
- var7 = true;
- } else {
- var7 = false;
- }
-
- int var5 = this.decryptBlock(var1, var2, var4, var6, var7);
- if (var5 == 0) {
- if (!var7) {
- throw new Exception("Internal Decrypt Sync Error");
- }
- break;
- }
-
- var6 += var5;
- var2 += 8;
- }
-
- if (var6 != var4.length) {
- byte[] var8 = new byte[var6];
- StringUtils.bcopy(var4, var8, var6);
- return var8;
- } else {
- return var4;
- }
- }
- }
-
- public String dump(byte[] var1, int var2) {
- StringBuffer var3 = new StringBuffer(var2 * 2);
-
- for(int var4 = 0; var4 < var2; ++var4) {
- byte var5 = (byte)(var1[var4] >> 4 & 15);
- var3.append((char)(var5 + (var5 < 10 ? 48 : 55)));
- var5 = (byte)(var1[var4] & 15);
- var3.append((char)(var5 + (var5 < 10 ? 48 : 55)));
- }
-
- return new String(var3);
- }
- }
-